package response

import (
	"cloud-navigation/global"
	"net/http"
	"os"

	"github.com/gin-gonic/gin"
)

type Response struct {
	ErrorCode int         `json:"error_code"` // 自定义错误码
	Data      interface{} `json:"data"`       // 数据
	Message   string      `json:"message"`    // 信息
}
type Validator struct {
	Field   string `json:"field"` // 字段名
	Message string `json:"message"`
}
type PageResponse[R any] struct {
	Total       int64  `json:"total"`
	CurrentPage uint64 `json:"current_page"`
	Data        []R    `json:"data"`
}

// 响应成功
func Success(c *gin.Context, data interface{}) {
	c.JSON(http.StatusOK, Response{0, data, "ok"})
}

// 响应失败
func Fail(c *gin.Context, errorCode int, msg string, data interface{}) {
	c.JSON(http.StatusOK, Response{errorCode, data, msg})
}

// 返回自定义错误的错误信息
func FailByError(c *gin.Context, error global.CustomError) {
	Fail(c, error.ErrorCode, error.ErrorMsg, gin.H{})
}

// 请求参数验证失败
func ValidateFail(c *gin.Context, msg string, data Validator) {
	Fail(c, global.Errors.ValidateError.ErrorCode, msg, data)
}

// 业务逻辑失败
func BusinessFail(c *gin.Context, msg string) {
	Fail(c, global.Errors.BusinessError.ErrorCode, msg, gin.H{})
}

// Token验证失败
func TokenFail(c *gin.Context) {
	FailByError(c, global.Errors.TokenError)
}

// 服务器错误
func ServerError(c *gin.Context, err interface{}) {
	msg := "服务器错误"
	if global.App.Config.App.Env != "production" && os.Getenv(gin.EnvGinMode) != gin.ReleaseMode {
		if _, ok := err.(error); ok {
			msg = err.(error).Error()
		}
	}
	c.JSON(http.StatusInternalServerError, Response{
		http.StatusInternalServerError,
		nil,
		msg,
	})
	c.Abort()
}
